# 定义全局变量
import os
import time
from datetime import timedelta

from tool.dingding_rebot import send_ding_msg

# 项目根目录  D:\A_Git\api-framework\demo_case
BASE_DIR = os.path.dirname(os.path.abspath(__file__))


# TODO 自动化测试结果通知 默认True  发送钉钉消息
is_dd_msg = True
def pytest_terminal_summary(terminalreporter):
    '''
    pytest框架里面预定义的钩子函数，用于在测试结束后自动化收集测试结果
    :param terminalreporter:
    :return:
    '''

    # 获取测试结果
    result = terminalreporter.stats
    #print(result)
    # 获取测试用例总数
    total = terminalreporter._numcollected
    # print(f'测试用例总数：{total}')

    # 获取测试用例失败总数 如果没有失败用例，则返回空列表[]
    # 失败数 failed 表示测试用例执行过程中断言失败的数量
    failed = len(terminalreporter.stats.get('failed', []))
    # print(f'测试用例失败数：{failed}')

    # 获取测试用例通过总数
    passed = len(terminalreporter.stats.get('passed', []))
    # print(f'测试用例通过数：{passed}')

    # 获取deselected
    deselected = len(terminalreporter.stats.get('deselected', []))
    # 获取错误
    # error_num 表示测试过程中发生的无法处理的异常情况的数量
    error_num = len(terminalreporter.stats.get('error', []))

    # 测试执行时间，保留两位小数round('',2)
    duration = round(time.time() - terminalreporter._sessionstarttime,2)

    # 时间显示时分秒样式
    # 格式 00:00:03
    duration_pro = time.strftime("%H:%M:%S", time.gmtime(duration))
    # 格式 0:00:03
    duration_pro02 = str(timedelta(seconds=duration)).split('.')[0]

    # 统计通过率，失败率，错误率
    pass_rate = f"{(passed/total)*100:.0f}%" if total > 0 else 'N/A'
    fail_rate = f"{(failed/total)*100:.0f}%" if total > 0 else 'N/A'
    error_rate = f"{(error_num/total)*100:.0f}%" if total > 0 else 'N/A'

    summary = f'''
    自动化测试结果，通知如下，具体执行结果：
        测试用例总数：{total}
        测试用例通过数：{passed}  
        通过率：{pass_rate}
        测试用例失败数(断言失败)：{failed}  
        失败率：{fail_rate}
        错误数(程序出错)：{error_num}  
        错误率：{error_rate}
        跳过不执行数量：{deselected}
        执行总时长：{duration}s ({duration_pro})
    '''
    if is_dd_msg:
        send_ding_msg(summary,at_all=True)